home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 422_02 / dosutil / park.c < prev    next >
C/C++ Source or Header  |  1994-03-20  |  3KB  |  124 lines

  1. /*
  2.  * A configurable disk parking utility.
  3.  *
  4.  * Copyright 1991-1994 Dave Dunfield
  5.  * All rights reserved.
  6.  *
  7.  * Permission granted for personal (non-commercial) use only.
  8.  *
  9.  * Compile command: cc park -fop
  10.  */
  11. #include <stdio.h>
  12.  
  13.     int parms[12] = 2;        /* Default, 2 drives park via BIOS */
  14.  
  15.     extern char PSP[];        /* To determine address of COM start */
  16.  
  17. /*
  18.  * Main program - parse arguments, park drives
  19.  */
  20. main(argc, argv)
  21.     int argc;
  22.     int *argv[];
  23. {
  24.     int drive, cyl, flag;
  25.     FILE *fp;
  26.  
  27.     flag = cyl = 0;
  28.     for(drive = 1; drive < argc; ++drive) switch(*argv[drive]) {
  29.         case '?-' :        /* Help request */
  30.         case '?'  :
  31.             abort("\nUse: park [-s cyl1 cyl2 ...]\n\nCopyright 1991 Dave Dunfield\nAll rights reserved.\n");
  32.         case 's-' :        /* Setup command */
  33.         case 'S-' :
  34.             flag = -1;
  35.             break;
  36.         default:
  37.             if(!isdigit(*(char*)argv[drive]))
  38.                 abort("Invalid operand.");
  39.             parms[parms[0] = ++cyl] = atoi(argv[drive]); }
  40.  
  41.     if(flag) {                /* Setup mode */
  42.         putc('\n', stdout);
  43.         for(drive=1; drive <= *parms; ++drive) {
  44.             printf("Park drive %u ", drive);
  45.             if(flag = parms[drive])
  46.                 printf("at cylinder %u\n", flag);
  47.             else
  48.                 printf("via BIOS\n"); }
  49.         if(cyl) {            /* Set options */
  50.             fp = fopen("PARK.COM", "bwvq");
  51.             fwrite(0x100, PSP-0x102, fp);
  52.             fclose(fp);
  53.             printf("\nPARK.COM written!\n"); }
  54.         return; }
  55.  
  56.     printf("System shutdown in progress...\n\n");
  57.  
  58.     asm " MOV AH,0Dh";    /* Disk reset command */
  59.     asm " INT 21h";        /* Ask DOS */
  60.  
  61.     for(drive = 1; drive <= *parms; ++drive) {
  62.         if(!test_disk(drive)) {
  63.             printf("Drive %u ", drive);
  64.             if(!(cyl = parms[drive]))
  65.                 cyl = max_cyl(drive);
  66.             flag = seek_disk(drive, cyl);
  67.             printf("parked at cylinder %u", cyl);
  68.             if(flag)
  69.                 printf(" - *flag %02x*", flag);
  70.             putc('\n', stdout); } }
  71.  
  72.     printf("\nTurn system power OFF now!!! ");
  73.  
  74.     while(getc(stdin) != '\n');
  75. }
  76.  
  77. /*
  78.  * Recalibrate the fixed disk (also determine its existance)
  79.  */
  80. test_disk(drive) asm
  81. {
  82.         MOV        DL,4[BP]    ; Get drive id
  83.         ADD        DL,7fh        ; Offset to drive
  84.         MOV        AH,11h        ; Recalibrate
  85.         INT        13h            ; Ask BIOS
  86.         MOV        AL,AH        ; Set low value
  87.         XOR        AH,AH        ; Zero high
  88. }
  89.  
  90. /*
  91.  * Get the maximum cylinder number for drive
  92.  */
  93. max_cyl(drive) asm
  94. {
  95.         MOV        DL,4[BP]    ; Get drive id
  96.         ADD        DL,7fh        ; Convert ID
  97.         MOV        AH,08h        ; Get parms function
  98.         INT        13h            ; Ask BIOS
  99.         MOV        AL,CH        ; Get LOW byte of result
  100.         MOV        AH,CL        ; Get HIGH two bits
  101.         MOV        CL,6        ; Shift 6 bits
  102.         SHR        AH,CL        ; Do the shift
  103. }
  104.  
  105. /*
  106.  * Seek to specified cylinder on fixed disk
  107.  */
  108. seek_disk(drive, cyl) asm
  109. {
  110.         MOV        DL,6[BP]    ; Get drive id
  111.         ADD        DL,7fh        ; Convert to BIOS id
  112.         MOV        AL,5[BP]    ; Get high cylinder
  113.         MOV        CL,6        ; Shift 6 bits
  114.         SHL        AL,CL        ; Perform shift
  115.         INC        AL            ; Sector 1
  116.         MOV        CL,AL        ; Set high bits
  117.         MOV        CH,4[BP]    ; Get LOW cylinder
  118.         XOR        DH,DH        ; Head zero
  119.         MOV        AH,0Ch        ; Function 13 SEEK
  120.         INT        13h            ; Ask BIOS
  121.         MOV        AL,AH        ; Put RC in lower byte
  122.         XOR        AH,AH        ; Zero upper byte
  123. }
  124.